#! /usr/bin/env python
# -*- coding: utf-8 -*-

import time
from playwright.sync_api import Page
from ui_automation_test.common.base_page import BasePage
from locators.dualPrevention.riskGrading.riskUnit.loc_risk_unit_add import LocAddUnit
from locators.dualPrevention.riskGrading.riskUnit.loc_risk_unit_edit import LocEditUnit
from locators.dualPrevention.riskGrading.riskUnit.loc_risk_unit_search import LocSearchUnit
from ui_automation_test.locators.dualPrevention.riskGrading.riskUnit.loc_risk_unit_view import LocViewUnit
from ui_automation_test.common.logger import logger

class RiskUnitPage(BasePage):
    def __init__(self, page: Page):
        super().__init__(page)
        self.switch_menu('双重预防机制')
        self.switch_menu('风险分析清单管理')
        self.switch_menu('风险分析单元')

    def add_unit(self, unit_name, unit_type=None, object_name=None, basis=None):
        logger.info('开始风险分析单元新增测试')
        logger.info('点击新增按钮')
        self.page.get_by_role('button', name='新增').first.click()
        logger.info('选择风险分析对象名称')
        self.select(LocAddUnit.loc_object_select, object_name)
        logger.info('输入风险分析单元名称')
        self.fill(LocAddUnit.loc_unit_name, unit_name)
        logger.info('选择风险分析单元类型')
        # 使用Element UI特定的定位方式，避免占位符拦截
        dialog = self.page.get_by_role('dialog', name='新 增')
        # 通过label文本找到对应的表单项 - 使用更灵活的文本匹配
        form_item = dialog.locator('label:has-text("风险分析单元类型")').locator('..')
        # 点击下拉框的wrapper，避免被占位符拦截
        form_item.locator('.el-select__wrapper').click()
        # 等待下拉选项出现
        time.sleep(0.5)
        # 选择指定选项
        if unit_type:
            logger.info(f"选择选项：{unit_type}")
            self.page.get_by_role('option', name=unit_type, exact=True).click()
        logger.info('提交')
        self.click(LocAddUnit.loc_submit)

    def edit_unit(self, unit_name, unit_type=None,  basis=None):
        """
        编辑风险分析单元
        :param unit_type: 风险分析单元类型
        :param unit_name: 所属风险分析单元名称
        :param basis: 划分依据
        """
        logger.info('开始风险分析单元编辑测试')
        logger.info('点击编辑按钮')
        self.click(LocEditUnit.loc_edit_button)
        logger.info('输入风险分析单元名称')
        self.fill(LocEditUnit.loc_unit_name, unit_name)
        logger.info('选择风险分析单元类型')
        # 使用Element UI特定的定位方式，避免占位符拦截
        dialog = self.page.get_by_role('dialog', name='编 辑')
        # 通过label文本找到对应的表单项 - 使用更灵活的文本匹配
        form_item = dialog.locator('label:has-text("风险分析单元类型")').locator('..')
        # 点击下拉框的wrapper，避免被占位符拦截
        form_item.locator('.el-select__wrapper').click()
        # 等待下拉选项出现
        time.sleep(0.5)
        # 选择指定选项
        if unit_type:
            logger.info(f"选择选项：{unit_type}")
            self.page.get_by_role('option', name=unit_type, exact=True).click()
        if basis:
            logger.info('输入划分依据')
            self.fill(LocEditUnit.loc_basis, basis)
        logger.info('提交')
        self.click(LocEditUnit.loc_submit)

    def search_unit(self, unit_name=None, company=None, object_name=None, unit_type=None):
        """
        查询风险分析单元
        :param unit_name: 风险分析单元名称
        :param company: 所属企业
        :param object_name: 所属风险分析对象
        :param unit_type: 风险分析单元类型
        """
        logger.info('开始风险分析单元查询')
        if company:
            logger.info(f'选择所属企业: {company}')
            self.select(LocSearchUnit.loc_company_select, company)
        if object_name:
            logger.info(f'选择所属风险分析对象: {object_name}')
            self.select(LocSearchUnit.loc_object_select, object_name)
        if unit_name:
            logger.info(f'选择单元名称: {unit_name}')
            self.select(LocSearchUnit.loc_unit_name_select, unit_name)
        logger.info('点击查询按钮')
        self.click(LocSearchUnit.loc_search_button)

    def view_unit(self, unit_name):
        """
        查看风险分析单元详情
        :param unit_name: 风险分析单元名称
        """
        logger.info('开始风险分析单元查看测试')
        logger.info('点击查看按钮')
        self.click(LocViewUnit.loc_view_button)
        logger.info('查看风险分析单元详情')
        # 先定位到卡片区域
        card = self.page.locator('div:has-text("风险分析单元信息")')
        # 只选卡片内 class 为 el-button--primary 且文本为“返回”的按钮
        back_btn = card.locator('button.el-button--primary', has_text="返回")
        back_btn.scroll_into_view_if_needed()
        back_btn.click()


    def delete_unit_by_name(self, unit_name):
        """
        根据单元名称删除风险分析单元
        """
        logger.info(f'准备删除单元：{unit_name}')
        row = self.page.locator('.el-table__body tr').filter(has_text=unit_name).nth(0)
        row.get_by_text('删除').click()
        # 等待并点击确认弹窗的“确定”按钮
        self.page.get_by_role('button', name='确定').click()
        logger.info(f'已删除单元：{unit_name}')